package com.hatricks.algorithm.leetcode.palindromeverify_125;

/**
 * @packageName: com.hatricks.algorithm.leetcode
 * @className: PalindromeVerify
 * @author: yanyuhui yanyuhui@chinasofti.com
 * @date: 2021/5/25 10:06
 * @description: 验证回文串
 */
public class PalindromeVerifyReverse {

    /*
     * 给定一个字符串，验证它是否是回文串，只考虑字母和数字字符，可以忽略字母的大小写。
     * 说明：本题中，我们将空字符串定义为有效的回文串。
     * 示例 1:
     *
     * 输入: "A man, a plan, a canal: Panama"
     * 输出: true
     * 示例 2:
     *
     * 输入: "race a car"
     * 输出: false
     * 解题思路:
     * 第一种:
     *       回文串的定义: 从前到后以及从后到前的字母排序是一致的,比如"我家爱家我"
     *
     *       1.将给定字符串进行过滤,仅保留字母和数字字符
     *       2.将保留下来的字符串进行反转
     *       3.忽略其大小写进行比较就可以判定一个字符串是否为回文字符串
     * 第二种:
     *       1.遍历给定字符串跳过非字母和数字字符
     *       2.判断前后的值是否相等直到碰头
     */
    public static void main(String[] args) {
        System.out.println(isPalindrome("A man, a plan, a canal: Panama"));
    }

    //高层次主干逻辑 直接走逻辑 然后进行逻辑填充
    public static boolean isPalindrome(String s) {
        //1.先过滤字母和数字字符
        String filters = filterNonNumberAndChar(s);
        //2.对于过滤之后的反转,如果和之前一样
        String reversedS = reverseString(filters);
        return reversedS.equalsIgnoreCase(filters);
    }

    private static String reverseString(String filters) {
        return new StringBuilder(filters).reverse().toString();
    }

    private static String filterNonNumberAndChar(String s) {
        return s.replaceAll("[^A-Za-z0-9]", "");
    }

}
